package com.dkm.orproject.dkmoa.action.flow;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dkm.orproject.dkmoa.domain.OaDimissionHandover;
import com.dkm.orproject.dkmoa.domain.OaLog;
import com.dkm.orproject.dkmoa.domain.OaPersonnel;
import com.dkm.orproject.dkmoa.domain.vo.OaDimissionHandoverVo;
import com.dkm.orproject.dkmoa.service.flow.OaDimissionHandoverService;
import com.dkm.orproject.utils.jwt.login.UserLoginToken;
import com.dkm.orproject.utils.utils.Tools;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *  @ClassName : OaDimissionHandoverAction  //类名
 *  @Description : 离职交接工作  //描述
 *  @Author : 石智诚  //作者
 *  @Date: 2020-09-16 09:42  //时间
 */
@RestController
@RequestMapping("/OaDimissionHandoverAction")
public class OaDimissionHandoverAction {
    /**
     * 员工离职交接接口
     */
    @Resource
    OaDimissionHandoverService handoverSerivce;

    /**
     * 前台传值工具类
     */
    @Resource
    Tools tools;

    /**
     * 回调值
     */
    int row=0;

    /**
     * 日志
     */
    OaLog log;

    /**
     * 登陆人
     */
    OaPersonnel personnel;

    /**
     * 回调map
     */
    Map<String,Object> map;

    /**
     * 分页查询
     * @param handover 交接流程模型
     * @param page 当前页数
     * @param limit 显示行数
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @param request 服务器请求 用于得到登陆人信息
     * @return 模型集
     */
    @UserLoginToken
    @GetMapping("handoverFindAll")
    public Map<String,Object> handoverFindAll(OaDimissionHandover handover,
                                      Integer page,
                                      Integer limit,
                                      String startDate,
                                      String endDate,
                                      HttpServletRequest request){

        try{
            List<OaDimissionHandover> list=handoverSerivce.findAll(handover,page,limit,startDate,endDate);
            Long rowCount=handoverSerivce.rowCount(handover,startDate,endDate);
            return Tools.maps(list,rowCount);
        }catch (Exception e){
            addErrorLog(request,"人员离职流程分页查询",e);
        }
        return null;
    }


    /**
     * 起草节点
     * @param handover 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 回调函数
     */
    @UserLoginToken
    @PostMapping("addHover")
    public int addDimissionFlow(OaDimissionHandover handover, HttpServletRequest request,@RequestParam("pname") String pname){
        rowMap(request);
        try{
            return handoverSerivce.add(handover,personnel,pname);
        }catch (Exception e){
            addErrorLog(request,"人员交接工作起草节点",e);
            return 500;
        }
    }

    /**
     * 部门领导通过
     * @param pkDimissionHandoverId 交接流程ID
     * @param request 服务器请求 用于得到登陆人信息
     * @return 通过的数量
     */
    @UserLoginToken
    @PostMapping("handoverSectionPass")
    public int sectionPass(@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId, HttpServletRequest request){
        rowMap(request);
        try{
            return handoverSerivce.departmentPass(pkDimissionHandoverId,personnel);
        }catch (Exception e){
            addErrorLog(request,"部门领导通过",e);
            return 500;
        }
    }

    /**
     * 部门领导不通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 数量
     */
    @UserLoginToken
    @PostMapping("handoverSectionNoPass")
    public int sectionNoPass(@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId,@RequestParam("departmentLeadership") String departmentLeadership,HttpServletRequest request){
        rowMap(request);
        try{
            return handoverSerivce.departmentNoPass(pkDimissionHandoverId,personnel,departmentLeadership);
        }catch (Exception e){
            addErrorLog(request,"部门领导不通过",e);
            return 500;
        }
    }

    /**
     * 行政部节点
     * @param handover 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 回调函数
     */
    @UserLoginToken
    @PostMapping("addSection")
    public int addSection(OaDimissionHandover handover, HttpServletRequest request){
        rowMap(request);
        try{
            return handoverSerivce.sectionPass(handover,personnel);
        }catch (Exception e){
            addErrorLog(request,"交接行政部起草节点",e);
            return 500;
        }
    }
    /**
     * 当事人通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 成功与否
     */
    @UserLoginToken
    @PostMapping("personPass")
    public int personPass(HttpServletRequest request,@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId){
        rowMap(request);
        try{
            return handoverSerivce.personPass(pkDimissionHandoverId,personnel);
        }catch (Exception e){
            addErrorLog(request,"当事人确认通过",e);
            return 500;
        }

    }
    /**
     * 人事经理通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 成功与否
     */
    @UserLoginToken
    @PostMapping("managerPass")
    public int managerPass(HttpServletRequest request,@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId){
        rowMap(request);
        try{
            return handoverSerivce.staffingPass(pkDimissionHandoverId,personnel);
        }catch (Exception e){
            addErrorLog(request,"人事经理通过",e);
            return 500;
        }

    }
    /**
     * 人事不通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 成功与否
     */
    @UserLoginToken
    @PostMapping("managerNoPass")
    public int managerNoPass(@RequestParam("departmentLeadership") String departmentLeadership,HttpServletRequest request,@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId){
        rowMap(request);
        try{
            return handoverSerivce.staffingNoPass(pkDimissionHandoverId,personnel,departmentLeadership);
        }catch (Exception e){
            addErrorLog(request,"人事不通过",e);
            return 500;
        }

    }
    /**
     * 总经理通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 成功与否
     */
    @UserLoginToken
    @PostMapping("executivePass")
    public int executivePass(HttpServletRequest request,@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId){
        rowMap(request);
        try{
            return handoverSerivce.executivePass(pkDimissionHandoverId,personnel);
        }catch (Exception e){
            addErrorLog(request,"人事经理通过",e);
            return 500;
        }

    }
    /**
     * 总经理不通过
     * @param pkDimissionHandoverId 离职流程模型
     * @param request 服务器请求 用于得到登陆人信息
     * @return 1和0
     */
    @UserLoginToken
    @PostMapping("executiveNoPass")
    public int executiveNoPass(@RequestParam("departmentLeadership") String departmentLeadership,HttpServletRequest request,@RequestParam("pkDimissionHandoverId") Long pkDimissionHandoverId){
        rowMap(request);
        try{
            return handoverSerivce.executiveNoPass(pkDimissionHandoverId,personnel,departmentLeadership);
        }catch (Exception e){
            addErrorLog(request,"人事不通过",e);
            return 500;
        }

    }

    /**
     *
     * @param id 离职流程id
     * @param request 服务器请求 用于得到登录人信息
     * @return 离职流程模型
     */
    @UserLoginToken
    @GetMapping("findById/{id}")
    public OaDimissionHandover findById(@PathVariable("id") Long id, HttpServletRequest request){
        rowMap(request);
        try{
            return handoverSerivce.selectById(id);
        }catch (Exception e){
            addErrorLog(request,"人员离职id查询",e);
        }
        return null;
    }
    /**
     *
     * @param id 离职流程id
     * @param request 服务器请求 用于得到登录人信息
     * @return 离职流程模型
     */
    @UserLoginToken
    @GetMapping("selectById/{id}")
    public OaDimissionHandoverVo selectById(@PathVariable("id") Long id, HttpServletRequest request){
        rowMap(request);
        try{
            return handoverSerivce.findById(id);
        }catch (Exception e){
            addErrorLog(request,"人员离职id查询",e);
        }
        return null;
    }

    /**
     * id删除
     * @param id 离职流程id
     * @param request 服务器请求
     * @return 回调函数
     */
    @UserLoginToken
    @DeleteMapping("deleteById/{id}")
    public Map<String,Object> deleteById(@PathVariable("id") Long id, HttpServletRequest request){
        rowMap(request);
        if(ObjectUtils.isEmpty(personnel)){
            return tools.rowMap(map,0,null);
        }
        try{
            OaDimissionHandover handover=handoverSerivce.selectById(id);
            row=handoverSerivce.deleteByPrimaryKey(id);
            log.setLogTitle("人员离职删除");
            log.setLogBody(JSONObject.toJSON(handover).toString());
            log.setLogType("1");
            tools.rowMap(map,row,log);
        }catch (Exception e){
            addErrorLog(request,"人员离职删除",e);
        }

        return map;
    }
    @UserLoginToken
    @DeleteMapping("deleteAll")
    public Map<String,Object> deleteAll(@RequestParam(value = "ids[]",required = false) Long[] ids,HttpServletRequest request){
        rowMap(request);
        if(ObjectUtils.isEmpty(ids)){
            return tools.rowMap(map,0,null);
        }
        try{
            //将Long 类型数组转换为List集合
            List<Long> list= Arrays.asList(ids);
            List<OaDimissionHandover> handovers = handoverSerivce.selectAll(list);
            row=handoverSerivce.deleteAll(list);
            log.setLogTitle("转正流程删除");
            log.setLogBody(JSON.toJSON(handovers).toString());
            log.setLogType("1");
            tools.rowMap(map,row,log);
        }catch (Exception e){
            addErrorLog(request,"转正流程删除",e);
        }
        return map;
    }


    /**
     * 查询报错日志新增
     * @param request 请求 用于得到当前登录人和ip地址
     * @param title 模块标题
     * @param e 异常参数
     */
    private void addErrorLog(HttpServletRequest request,String title,Exception e){
        e.printStackTrace();
        rowMap(request);
        log.setLogType("0");
        log.setLogBody(e.getLocalizedMessage());
        log.setLogTitle(title);
        if(ObjectUtils.isEmpty(personnel)){
            log.setCreatedBy(personnel.getPersonnelName());
        }
        tools.errorMap(log);
    }

    /**
     * 简化代码
     * @param request 服务器请求
     */
    private void rowMap(HttpServletRequest request){
        //新建返回Map模型
        map=new HashMap<>(16);
        //获取登陆人信息
        personnel= (OaPersonnel) request.getSession().getAttribute("user");
        //为空则清空map
        if(ObjectUtils.isEmpty(personnel)){
            return;
        }
        //新建日志
        log=new OaLog();
        //得到ip
        log.setLogIp(request.getRemoteAddr());
        //登陆人名称
        log.setCreatedBy(personnel.getPersonnelName());
    }

    /**
     * 日期格式化
     *
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        // true:允许输入空值，false:不能为空值
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }


}
